package com.huilan.hgt.util;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.Vector;

/**
 * 从一个实体集合 copy 数据到另一个实体集合中
 * @Author lplu
 * @date 2018/6/21
 */
public class CopyListEntityUtil<S, T> {
    /**
     * 根据源数据page中的集合 copy  到结果数据page中(分页)
     * @Author: lplu
     * @Date: 2018-6-26 09:48:10
     * @param src  源数据集合
     * @param targetType 结果数据实体类型
     * @return:  Page
     */
    public static<T,S> Page<T> copyPage(Page<S> src, Class<T> targetType) {
        Page<T> page = new Page<T>();
        //结果集
        List<T> targetList = new Vector<T>();
        List<S> srcList = src.getRecords();
        for ( S s : srcList ) {
            T t = BeanUtils.instantiateClass(targetType);
            BeanUtils.copyProperties(s, t);
            targetList.add(t);
        }
        //将新的结果集赋给Page
        page.setRecords(targetList);
        page.setSize(src.getSize());
        page.setTotal(src.getTotal());
        page.setCurrent(src.getCurrent());
        return page;
    }
    /**
     * 根据源数据集合 copy  到结果数据集合中(分页)
     * @Author: lplu
     * @Date: 2018/6/22 9:37
     * @param src  源数据集合
     * @param targetType 结果数据实体类型
     * @return:  PageInfo
     */
//    public static<T,S> PageInfo copyPageInfo(List<S> src, Class<T> targetType) {
//        PageInfo pageInfo = new PageInfo(src);
//        //结果集
//        List<T> target = new Vector<T>();
//        for ( S s : src ) {
//            T t = BeanUtils.instantiateClass(targetType);
//            BeanUtils.copyProperties(s, t);
//            target.add(t);
//        }
//        //将新的结果集赋给pageInfo
//        pageInfo.setList(target);
//        return pageInfo;
//    }
    /**
     * 根据源数据集合 copy  到结果数据集合中(不分页)
     * @Author: lplu
     * @Date: 2018/6/22 11:18
     * @param src  源数据集合
     * @param targetType 结果数据实体类型
     * @return: 结果集
     */
    public static <T, S> List<T> copy(List<S> src, Class<T> targetType) {
        //结果集
        List<T> target = new Vector<>();
        if (src != null && !src.isEmpty()) {
            for ( S s : src ) {
                T t = BeanUtils.instantiateClass(targetType);
                BeanUtils.copyProperties(s, t);
                target.add(t);
            }
        }
        return target;
    }

    /**
     * 将源对象转换成目标对象
     * @Author: lplu
     * @Date: 2018/6/26 16:32
     * @param src 源对象
     * @param tClass 目标对象类
     * @return: 目标对象
     */
    public static<T> T copyProperties(Object src, Class<T> tClass){
        T t = BeanUtils.instantiateClass(tClass);
        BeanUtils.copyProperties(src,t);
        return t;
    }



    public static<T,S> Object po2dto(Object obj, Class<T> tClass){
        if(obj instanceof Page){
            Page src = ((Page) obj);
            Page<T> page = new Page<T>();
            //结果集
            List<T> targetList = new Vector<T>();
            List<S> srcList = src.getRecords();
            for ( S s : srcList ) {
                T t = BeanUtils.instantiateClass(tClass);
                BeanUtils.copyProperties(s, t);
                targetList.add(t);
            }
            //将新的结果集赋给Page
            page.setRecords(targetList);
            page.setSize(src.getSize());
            page.setTotal(src.getTotal());
            page.setCurrent(src.getCurrent());
            return page;
        }else if(obj instanceof List){
            List<S> src = (List) obj;
            //结果集
            List<T> target = new Vector<T>();
            for ( S s : src ) {
                T t = BeanUtils.instantiateClass(tClass);
                BeanUtils.copyProperties(s, t);
                target.add(t);
            }
            return target;
        }else{
            T t = BeanUtils.instantiateClass(tClass);
            BeanUtils.copyProperties(obj,t);
            return t;
        }
    }
}
